//
//  SchedulerScene.cpp
//  SimpleGame
//
//  Created by Scar1et on 2017/7/27.
//
//

// 头文件 -- 类库声明请放入头文件
#include "SchedulerScene.h"

// 层级：影响显示与事件响应
enum {
    // 背景
    levelBGSimple = 1,
    // 内容
    levelContentSimple = 101,
    // 对话框
    levelDialogSimple = 1001
};

// TAG：视图标记
enum {
    tagBack = 1,
    tagSchedulerDefault = 2,
    tagSchedulerCustom1 = 3,
    tagSchedulerCustom2 = 4,
    tagSchedulerCustom3 = 5,
    tagSchedulerOnce = 6,
};

// 创建场景
Scene* SchedulerScene::createScene() {
    Scene* sScheduler = Scene::create();
    sScheduler->addChild(SchedulerScene::create());
    return sScheduler;
}

// 初始化场景，自动调用
bool SchedulerScene::init() {
    // 先调用父类Init
    if (!Layer::init()) {
        return false;
    }
    
    // 手机按键监听器
    listenerKeyboard = EventListenerKeyboard::create();
    listenerKeyboard->onKeyReleased = CC_CALLBACK_2(SchedulerScene::onKeyReleased, this);
    // 添加到事件分发器中
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listenerKeyboard, this);
    
    // 开始初始化
    // 成员变量初始化
    // 可视区域尺寸
    sizeVisible = Director::getInstance()->getVisibleSize();
    // 可视区域的出发点坐标
    positionOrigin = Director::getInstance()->getVisibleOrigin();
    // 屏幕尺寸
    sizeWin = Director::getInstance()->getWinSize();
    
    this->initContent();
    
    // 初始化成功
    return true;
}

// 内容初始化
void SchedulerScene::initContent() {
    // 返回按钮
    auto lBack = Label::createWithSystemFont("返回", "arial.ttf", 28);
    lBack->setTextColor(Color4B::WHITE);
    lBack->setHorizontalAlignment(TextHAlignment::LEFT);
    lBack->setVerticalAlignment(TextVAlignment::CENTER);
    lBack->setDimensions(120, 40);
    auto milBack = MenuItemLabel::create(lBack, CC_CALLBACK_1(SchedulerScene::onClicked, this));
    milBack->setTag(tagBack);
    milBack->setPosition(Vec2(positionOrigin.x + 80, positionOrigin.y + sizeVisible.height - 40));
    
    // 按钮菜单 -- Scheduler【可添加多个，用NULL结尾】
    auto mScheduler = Menu::create(milBack, NULL);
    mScheduler->setPosition(Vec2::ZERO);
    this->addChild(mScheduler, levelContentSimple);
    
    // 精灵图标
    auto sSchedulerDefault = Sprite::create("icon_spirit.png");
    sSchedulerDefault->setPosition(Vec2(positionOrigin.x + 48, positionOrigin.y + sizeVisible.height - 128));
    this->addChild(sSchedulerDefault, levelContentSimple, tagSchedulerDefault);
    // 默认计时器
    // 一帧调用一次 update
    this->scheduleUpdate();
    
    // 精灵图标
    auto sSchedulerCustom1 = Sprite::create("icon_spirit.png");
    sSchedulerCustom1->setPosition(Vec2(positionOrigin.x + 48, positionOrigin.y + sizeVisible.height - 176));
    this->addChild(sSchedulerCustom1, levelContentSimple, tagSchedulerCustom1);
    // 自定义定时器 -- 一个参数
    // 一帧调用一次 updateCustom1
    this->schedule(CC_SCHEDULE_SELECTOR(SchedulerScene::updateCustom1));
    
    // 精灵图标
    auto sSchedulerCustom2 = Sprite::create("icon_spirit.png");
    sSchedulerCustom2->setPosition(Vec2(positionOrigin.x + 48, positionOrigin.y + sizeVisible.height - 224));
    this->addChild(sSchedulerCustom2, levelContentSimple, tagSchedulerCustom2);
    // 自定义定时器 -- 二个参数
    // 1.0f 秒调用一次 updateCustom2
    this->schedule(CC_SCHEDULE_SELECTOR(SchedulerScene::updateCustom2), 1.0f);
    
    // 精灵图标
    auto sSchedulerCustom3 = Sprite::create("icon_spirit.png");
    sSchedulerCustom3->setPosition(Vec2(positionOrigin.x + 48, positionOrigin.y + sizeVisible.height - 272));
    this->addChild(sSchedulerCustom3, levelContentSimple, tagSchedulerCustom3);
    // 自定义定时器 -- 三个参数
    // 1.0f 秒调用一次 updateCustom3
    // 一共调用5次
    // 3.0f 秒后开始第一次调用
    this->schedule(CC_SCHEDULE_SELECTOR(SchedulerScene::updateCustom3), 1.0f, 5, 3.0f);
    
    // 精灵图标
    auto sSchedulerOnce = Sprite::create("icon_spirit.png");
    sSchedulerOnce->setPosition(Vec2(positionOrigin.x + 48, positionOrigin.y + sizeVisible.height - 320));
    this->addChild(sSchedulerOnce, levelContentSimple, tagSchedulerOnce);
    // 一次性定时器
    // 5.0f 秒后调用 updateOnce 一次
    this->scheduleOnce(CC_SCHEDULE_SELECTOR(SchedulerScene::updateOnce), 5.0f);
}

// 默认定时器执行的方法
void SchedulerScene::update(float dt) {
    // 执行一次向右移动 1
    auto sTemp = this->getChildByTag(tagSchedulerDefault);
    sTemp->setPosition(Vec2(sTemp->getPosition().x + 1, sTemp->getPosition().y));
}

// 自定义定时器 1 执行的方法
void SchedulerScene::updateCustom1(float dt) {
    // 执行一次向右移动 1
    auto sTemp = this->getChildByTag(tagSchedulerCustom1);
    sTemp->setPosition(Vec2(sTemp->getPosition().x + 1, sTemp->getPosition().y));
}

// 自定义定时器 2 执行的方法
void SchedulerScene::updateCustom2(float dt) {
    // 执行一次向右移动 1
    auto sTemp = this->getChildByTag(tagSchedulerCustom2);
    sTemp->setPosition(Vec2(sTemp->getPosition().x + 60, sTemp->getPosition().y));
}

// 自定义定时器 3 执行的方法
void SchedulerScene::updateCustom3(float dt) {
    // 执行一次向右移动 60
    auto sTemp = this->getChildByTag(tagSchedulerCustom3);
    sTemp->setPosition(Vec2(sTemp->getPosition().x + 60, sTemp->getPosition().y));
}

// 一次性定时器执行的方法
void SchedulerScene::updateOnce(float dt) {
    // 执行一次向右移动 100
    auto sTemp = this->getChildByTag(tagSchedulerOnce);
    sTemp->setPosition(Vec2(sTemp->getPosition().x + 100, sTemp->getPosition().y));
}

// 返回功能
void SchedulerScene::back() {
    // 从事件分发器移除手机按键监听器
    Director::getInstance()->getEventDispatcher()->removeEventListener(listenerKeyboard);
    // 从场景堆栈中pop出一个场景，替换现在正运行的场景，而运行中的场景将被删除
    Director::getInstance()->popScene();
}

// 点击监听
void SchedulerScene::onClicked(Ref* rSender) {
    int tag = ((MenuItem*)rSender)->getTag();
    switch (tag) {
        case tagBack:
            // 返回按钮被点击
            this->back();
            break;
        default:
            break;
    }
}

// 键盘点击监听
void SchedulerScene::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event) {
    switch (keyCode){
        case EventKeyboard::KeyCode::KEY_BACK:
            // 返回键
            this->back();
            break;
        default:
            break;
    }
}
